home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / hard / drivr / BetaScan_1.12.lha / BetaScan / ScannerDev / Scsi.c < prev    next >
C/C++ Source or Header  |  1998-10-04  |  4KB  |  122 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <exec/io.h>
  4. #include <devices/scsidisk.h>
  5. #include <dos/dosextens.h>
  6.  
  7. #include <proto/exec.h>
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11. #include <signal.h>
  12.  
  13. #include "scanner.h"
  14. #include "scsi.h"
  15.  
  16. #define BUFSIZE 256
  17.  
  18. struct IOStdReq* SCSIReq;       /* a standard IORequest structure */
  19. struct SCSICmd   Cmd;           /* where the actual SCSI command goes */
  20. UBYTE  Sense[20];               /* buffer for request sense data */
  21.  
  22.  
  23. int openScannerDevice(char* dname,int unit)
  24. {
  25.   struct MsgPort *Port;
  26.  
  27.   if( Port = CreateMsgPort() )
  28.   {
  29.     if( SCSIReq = (struct IOStdReq*)CreateIORequest(Port,sizeof(struct IOStdReq)) )
  30.     {
  31.       if( OpenDevice( dname, unit, (struct IORequest *)SCSIReq, 0) )
  32.       {
  33.         DeleteIORequest(SCSIReq);
  34.         DeleteMsgPort(Port);
  35.         SCSIReq = NULL;
  36.       }
  37.     }
  38.     else
  39.       DeleteMsgPort(Port);
  40.   }
  41.   
  42.   return( SCSIReq != NULL);
  43. }
  44.  
  45. void closeScannerDevice(void)
  46. {
  47.   if( SCSIReq )
  48.   {
  49.     struct MsgPort *Port;
  50.  
  51.     Port = SCSIReq->io_Message.mn_ReplyPort;
  52.     CloseDevice( (struct IORequest *)SCSIReq );
  53.     DeleteIORequest(SCSIReq);
  54.     DeleteMsgPort(Port);
  55.     SCSIReq = NULL;
  56.   }
  57. }
  58.  
  59. /*------------------------------------------------------------------------*/
  60. /* int sendCommand()                                                        */
  61. /* Assembles the command packet to be sent to the SCSI device from the    */
  62. /* specified SCSI command and data, writes it, and reads the reply. If a  */
  63. /* reply size and buffer is specified, the reply data is copied into that */
  64. /* buffer.                                                                */
  65. /* The sense data is copied to scsi_sensebuffer.                          */
  66. /* Return: RET_SUCCESS if successful, RET_FAIL if errors occured.         */
  67. /*------------------------------------------------------------------------*/
  68. int sendCommand(unsigned char *scsi_cmd,int cmd_len,
  69.                 unsigned char *scsi_data,  int data_size,
  70.                 unsigned char *scsi_reply, int reply_size)
  71. {
  72.  
  73.   SCSIReq->io_Length  = sizeof(struct SCSICmd);
  74.   SCSIReq->io_Data    = (APTR)&Cmd;
  75.   SCSIReq->io_Command = HD_SCSICMD;        /* the command we are sending   */
  76.  
  77.   if( scsi_data )
  78.   {
  79.     Cmd.scsi_Data = (UWORD *)scsi_data;  /* where we put mode sense data */
  80.     Cmd.scsi_Length = data_size;         /* how much we will accept      */
  81.     Cmd.scsi_Flags = SCSIF_AUTOSENSE|SCSIF_WRITE; 
  82.   }
  83.   else if( scsi_reply )
  84.   {
  85.     Cmd.scsi_Data = (UWORD *)scsi_reply; /* where we put mode sense data */
  86.     Cmd.scsi_Length = reply_size;        /* how much we will accept      */
  87.     Cmd.scsi_Flags = SCSIF_AUTOSENSE|SCSIF_READ; 
  88.   }                                        
  89.   else
  90.   {
  91.     Cmd.scsi_Data = NULL;                /* where we put mode sense data */
  92.     Cmd.scsi_Length = 0;                 /* how much we will accept      */
  93.     Cmd.scsi_Flags = SCSIF_AUTOSENSE; 
  94.   }                                      /* set expected data direction  */
  95.   Cmd.scsi_SenseData =(UBYTE *)Sense;    /* where sense data will go     */
  96.   Cmd.scsi_SenseLength = 16;             /* how much we will accept      */
  97.   Cmd.scsi_SenseActual = 0;              /* how much has been received   */
  98.   Cmd.scsi_Status = 0;
  99.  
  100.   Cmd.scsi_Command = scsi_cmd;           /* issuing a MODE_SENSE command */
  101.   Cmd.scsi_CmdLength = cmd_len;          /* length of the command        */
  102.   DoIO( (struct IORequest *)SCSIReq );   /* send it to the device driver */
  103.  
  104.   if( Cmd.scsi_Status )
  105.   {
  106.     switch( Sense[0] )
  107.     {
  108.       case 0x00:  // ????
  109.         return SCAN_ERR_READY;
  110.       case 0x81:  // Command or data error
  111.       case 0x83:  // Operation error (illegal parameter values)
  112.         return SCAN_ERR_PARAMETER;
  113.       case 0x82:  // Hardware error
  114.         return SCAN_ERR_HARDWARE;
  115.       default:    // Other communication error
  116.         return SCAN_ERR_COMMUNICATION;
  117.     }
  118.   }
  119.   else
  120.     return 0;
  121. }
  122.